<!doctype html><html lang=en-us dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Github: https://github.com/argoproj
一、简介 # Argo Workflow 是一个开源的、基于 Kubernetes 的工作流引擎，用于编排和运行容器化应用的工作流程。它使用 YAML 文件来定义工作流、依赖关系和参数。
Argo Workflow 还支持任务的重试、跳过、并行执行和失败处理等功能。它提供了丰富的工作流控制和监控功能，可以查看工作流的状态、日志和执行历史，并支持自定义的事件触发和通知机制。
目前Argo团队下中有如下几个子项目：
argoproj Common project repo for all Argo Projects gitops-engine Public Democratizing GitOps argo-workflows Workflow engine for Kubernetes argo-cd Declarative continuous deployment for Kubernetes. argo-events Event-driven automation framework argo-rollouts Progressive Delivery for Kubernetes cd和rollouts一个是持续交付工具，一个是渐进式发布工具。 workflows和events一个是基于容器的任务编排工具，一个是事件驱动框架。这两者搭配可以设计出一个由新建任务事件触发从而启动工作流的方案。
流程如下： ![[content/docs/programmer/base/argo_events_workfows.png]] sensor作用 # 使事件转发和处理松耦合 Trigger事件的参数化，比如根据事件内容动态生成 二、Argo Workflow编排示例 # 以下是一个扔硬币和打印结果的示例，借此可以熟悉一下Workflow的编排语法
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: coinflip-recursive- spec: entrypoint: coinflip templates: - name: coinflip steps: - - name: flip-coin template: flip-coin - - name: heads template: heads when: &#34;{{steps."><meta name=theme-color content="#FFFFFF"><meta name=color-scheme content="light dark"><meta property="og:title" content><meta property="og:description" content="Github: https://github.com/argoproj
一、简介 # Argo Workflow 是一个开源的、基于 Kubernetes 的工作流引擎，用于编排和运行容器化应用的工作流程。它使用 YAML 文件来定义工作流、依赖关系和参数。
Argo Workflow 还支持任务的重试、跳过、并行执行和失败处理等功能。它提供了丰富的工作流控制和监控功能，可以查看工作流的状态、日志和执行历史，并支持自定义的事件触发和通知机制。
目前Argo团队下中有如下几个子项目：
argoproj Common project repo for all Argo Projects gitops-engine Public Democratizing GitOps argo-workflows Workflow engine for Kubernetes argo-cd Declarative continuous deployment for Kubernetes. argo-events Event-driven automation framework argo-rollouts Progressive Delivery for Kubernetes cd和rollouts一个是持续交付工具，一个是渐进式发布工具。 workflows和events一个是基于容器的任务编排工具，一个是事件驱动框架。这两者搭配可以设计出一个由新建任务事件触发从而启动工作流的方案。
流程如下： ![[content/docs/programmer/base/argo_events_workfows.png]] sensor作用 # 使事件转发和处理松耦合 Trigger事件的参数化，比如根据事件内容动态生成 二、Argo Workflow编排示例 # 以下是一个扔硬币和打印结果的示例，借此可以熟悉一下Workflow的编排语法
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: coinflip-recursive- spec: entrypoint: coinflip templates: - name: coinflip steps: - - name: flip-coin template: flip-coin - - name: heads template: heads when: &#34;{{steps."><meta property="og:type" content="article"><meta property="og:url" content="http://example.org/docs/programmer/base/argo-workflow%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%92%8C%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E5%88%86%E6%9E%90/"><meta property="article:section" content="docs"><title>Argo Workflow性能测试和使用场景分析 | Ian's Blog</title>
<link rel=manifest href=/manifest.json><link rel=icon href=/favicon.png type=image/x-icon><link rel=stylesheet href=/book.min.c58292d36b18b675680ab9baea2029204537b839ea72f258746ec0f32ce8d6c8.css integrity="sha256-xYKS02sYtnVoCrm66iApIEU3uDnqcvJYdG7A8yzo1sg=" crossorigin=anonymous><script defer src=/flexsearch.min.js></script><script defer src=/en.search.min.569e34257b6d9d9d98bef2eba3a64a9a25f6edeb684dcfd9d09d6515476ff4fa.js integrity="sha256-Vp40JXttnZ2YvvLro6ZKmiX27etoTc/Z0J1lFUdv9Po=" crossorigin=anonymous></script></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/><span>Ian's Blog</span></a></h2><div class=book-search><input type=text id=book-search-input placeholder=Search aria-label=Search maxlength=64 data-hotkeys=s/><div class="book-search-spinner hidden"></div><ul id=book-search-results></ul></div><ul><li class=book-section-flat><a href=/docs/programmer/>程序员笔记</a><ul><li><input type=checkbox id=section-52f633cba5cf47818d8ec01e928396f2 class=toggle checked>
<label for=section-52f633cba5cf47818d8ec01e928396f2 class="flex justify-between"><a role=button>Base</a></label><ul><li><a href=/docs/programmer/base/k8s-%E9%85%8D%E5%A5%97%E8%AF%B4%E6%98%8E/>k8s 配套说明</a></li><li><a href=/docs/programmer/base/k8s-%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/>k8s技术分享</a></li><li><a href=/docs/programmer/base/k8s%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E5%92%8C%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90/>k8s学习-常用命令和配置文件</a></li><li><a href=/docs/programmer/base/pypi/>PyPi</a></li><li><a href=/docs/programmer/base/tipsofweb/>Nginx高可用</a></li><li><a href=/docs/programmer/base/for_china/>各个软件换源</a></li><li><a href=/docs/programmer/base/tipsofdebugers/>tips Of Debuggers</a></li><li><a href=/docs/programmer/base/notesdjango/>Django的建站的(｡･･)ﾉﾞ</a></li><li><a href=/docs/programmer/base/tipsofvim/>tip Of vim</a></li><li><a href=/docs/programmer/base/editer/>编辑器使用</a></li><li><a href=/docs/programmer/base/noteoflinux/>Linux</a></li><li><a href=/docs/programmer/base/argo-workflow%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%92%8C%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E5%88%86%E6%9E%90/ class=active>Argo Workflow性能测试和使用场景分析</a></li><li><a href=/docs/programmer/base/argo-%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95/>Argo 使用记录</a></li><li><a href=/docs/programmer/base/kafka-%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8/>Kafka 安装和使用</a></li><li><a href=/docs/programmer/base/paramiko-%E4%BD%BF%E7%94%A8-sshsftp/>Paramiko 使用 Ssh&amp;sftp</a></li><li><a href=/docs/programmer/base/pytest-%E6%B5%8B%E8%AF%95/>Py Test 测试</a></li><li><a href=/docs/programmer/base/sonar-%E4%BB%A3%E7%A0%81%E9%9D%99%E6%80%81%E6%A3%80%E6%9F%A5/>Sonar 代码静态检查</a></li><li><a href=/docs/programmer/base/%E5%B0%8F%E5%91%BD%E4%BB%A4/>小命令</a></li><li><a href=/docs/programmer/base/tip_dgraph/>Dgraph</a></li><li><a href=/docs/programmer/base/noteoffmtdata/>数据格式笔记</a></li></ul></li><li><input type=checkbox id=section-de7bfad1d124522974cdf8addfbb23f2 class=toggle>
<label for=section-de7bfad1d124522974cdf8addfbb23f2 class="flex justify-between"><a role=button>Net</a></label><ul><li><a href=/docs/programmer/net/uwsgi-%E5%A4%84%E7%90%86%E8%AE%B0%E5%BD%95/>uwsgi 处理记录</a></li><li><a href=/docs/programmer/net/tipsofgrpc/>gRpc使用小记</a></li><li><a href=/docs/programmer/net/net/>网络(Computer Network)</a></li><li><a href=/docs/programmer/net/elk%E5%9C%A8k8s%E4%B8%8A%E7%9A%84%E9%83%A8%E7%BD%B2%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B/>Elk在k8s上的部署使用示例</a></li><li><a href=/docs/programmer/net/nginx%E5%AE%9E%E7%94%A8%E9%85%8D%E7%BD%AE/>Nginx实用配置</a></li></ul></li><li><input type=checkbox id=section-bf4e0d6f0b81f7b3ec08ed1fc66b874d class=toggle>
<label for=section-bf4e0d6f0b81f7b3ec08ed1fc66b874d class="flex justify-between"><a role=button>Langs</a></label><ul><li><a href=/docs/programmer/langs/cmake/>CMake 使用Tips</a></li><li><a href=/docs/programmer/langs/noteofgoexp/>Golang进阶笔记</a></li><li><a href=/docs/programmer/langs/noteofgolang/>Golang笔记</a></li><li><a href=/docs/programmer/langs/tipsofmarkdown/>tips Of markdown</a></li><li><a href=/docs/programmer/langs/notespython/>Python笔记(notes of Python)</a></li><li><a href=/docs/programmer/langs/notesjava/>愉快的Java(happy to learn the fuck java)</a></li></ul></li><li><input type=checkbox id=section-cd029da01a5cf373a5379dc078a74f2c class=toggle>
<label for=section-cd029da01a5cf373a5379dc078a74f2c class="flex justify-between"><a role=button>Game and Simulation</a></label><ul><li><a href=/docs/programmer/game_and_simulation/blender/>Blender</a></li><li><a href=/docs/programmer/game_and_simulation/noteofue4/>UE4 笔记</a></li></ul></li><li><input type=checkbox id=section-883e27361d38e16afb68faff3435ac0b class=toggle>
<label for=section-883e27361d38e16afb68faff3435ac0b class="flex justify-between"><a role=button>Ml</a></label><ul><li><a href=/docs/programmer/ml/tensorflow/>Tensorflow</a></li><li><a href=/docs/programmer/ml/opencv/>OpenCV</a></li><li><a href=/docs/programmer/ml/paddle/>Paddle</a></li><li><a href=/docs/programmer/ml/noteofmachinelearning/>机器学习库</a></li></ul></li><li><input type=checkbox id=section-7e5360c5e7954906b897ed79085884b6 class=toggle>
<label for=section-7e5360c5e7954906b897ed79085884b6 class="flex justify-between"><a href=/docs/programmer/gui/>Gui</a></label><ul><li><a href=/docs/programmer/gui/pyinstaller/>python打包</a></li><li><a href=/docs/programmer/gui/qt/>Qt/PySide</a></li><li><a href=/docs/programmer/gui/noteofvn_py/>Vn.Py学习笔记（Python交易平台框架）</a></li><li><a href=/docs/programmer/gui/notespython/>图形化界面 （Python Gui）</a></li></ul></li><li><input type=checkbox id=section-4446dd07527142b855f26d7cc8f0e617 class=toggle>
<label for=section-4446dd07527142b855f26d7cc8f0e617 class="flex justify-between"><a role=button>Database</a></label><ul><li><a href=/docs/programmer/database/dgraph/>Dgraph使用小记</a></li><li><a href=/docs/programmer/database/noteofdocker/>notes Of docker</a></li><li><a href=/docs/programmer/database/noteofdbdata/>db数据库</a></li><li><a href=/docs/programmer/database/mongodb/>Mongodb</a></li></ul></li><li><input type=checkbox id=section-d325c59fc6513e1b1e05a60b192d4973 class=toggle>
<label for=section-d325c59fc6513e1b1e05a60b192d4973 class="flex justify-between"><a href=/docs/programmer/hardware/>Hardware</a></label><ul><li><a href=/docs/programmer/hardware/android/>Android</a></li><li><a href=/docs/programmer/hardware/raspberrypi/>Raspberry Pi</a></li><li><a href=/docs/programmer/hardware/readme/>Readme</a></li><li><a href=/docs/programmer/hardware/screen/>Screen</a></li></ul></li><li><input type=checkbox id=section-40d35e91afa620ff2e7bf6291cfb3e1d class=toggle>
<label for=section-40d35e91afa620ff2e7bf6291cfb3e1d class="flex justify-between"><a href=/docs/programmer/software/>Software</a></label><ul><li><a href=/docs/programmer/software/bash/>Bash</a></li><li><a href=/docs/programmer/software/freebsd/>Freebsd</a></li><li><a href=/docs/programmer/software/gitbook/>Gitbook</a></li><li><a href=/docs/programmer/software/markdown/>Markdown</a></li><li><a href=/docs/programmer/software/npm/>Npm</a></li><li><a href=/docs/programmer/software/readme/>Readme</a></li><li><a href=/docs/programmer/software/vim/>Vim</a></li></ul></li><li><a href=/docs/programmer/install_some/>安装问题</a></li><li><a href=/docs/programmer/demo_test_some/>Demo Test项目中的一些东西</a></li><li><a href=/docs/programmer/tipsofproblems/>解决问题</a></li></ul></li><li class=book-section-flat><a href=/docs/example/>Hugo特殊Markdown语法说明</a><ul><li><a href=/docs/example/table-of-contents/>Table of Contents</a><ul><li><a href=/docs/example/table-of-contents/with-toc/>With ToC</a></li><li><a href=/docs/example/table-of-contents/without-toc/>Without ToC</a></li></ul></li><li class=book-section-flat><span>Shortcodes</span><ul><li><a href=/docs/example/shortcodes/buttons/>Buttons</a></li><li><a href=/docs/example/shortcodes/columns/>Columns</a></li><li><a href=/docs/example/shortcodes/details/>Details</a></li><li><a href=/docs/example/shortcodes/expand/>Expand</a></li><li><a href=/docs/example/shortcodes/hints/>Hints</a></li><li><input type=checkbox id=section-1c6a8516f710b6065a114907cef8489f class=toggle>
<label for=section-1c6a8516f710b6065a114907cef8489f class="flex justify-between"><a href=/docs/example/shortcodes/section/>Section</a></label><ul><li><a href=/docs/example/shortcodes/section/first-page/>First Page</a></li><li><a href=/docs/example/shortcodes/section/second-page/>Second Page</a></li></ul></li><li><a href=/docs/example/shortcodes/tabs/>Tabs</a></li></ul></li></ul></li></ul><ul><li><a href=/posts/>Blog</a></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/svg/menu.svg class=book-icon alt=Menu>
</label><strong>Argo Workflow性能测试和使用场景分析</strong>
<label for=toc-control><img src=/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#一简介>一、简介</a><ul><li><a href=#sensor作用>sensor作用</a></li></ul></li><li><a href=#二argo-workflow编排示例>二、Argo Workflow编排示例</a></li><li><a href=#三空间和性能>三、空间和性能</a><ul><li><a href=#etcd占用>ETCD占用</a></li><li><a href=#性能>性能</a></li></ul></li><li><a href=#总结>总结</a></li></ul></nav></aside></header><article class=markdown><p>Github: <a href=https://github.com/argoproj>https://github.com/argoproj</a></p><h2 id=一简介>一、简介
<a class=anchor href=#%e4%b8%80%e7%ae%80%e4%bb%8b>#</a></h2><p><code>Argo Workflow</code> 是一个开源的、基于 <code>Kubernetes</code> 的工作流引擎，用于编排和运行容器化应用的工作流程。它使用 <code>YAML</code> 文件来定义工作流、依赖关系和参数。</p><p>Argo Workflow 还支持任务的重试、跳过、并行执行和失败处理等功能。它提供了丰富的工作流控制和监控功能，可以查看工作流的状态、日志和执行历史，并支持自定义的事件触发和通知机制。</p><p>目前Argo团队下中有如下几个子项目：</p><ul><li><a href=https://github.com/argoproj/argopro>argoproj</a> <code>Common project repo for all Argo Projects</code></li><li><a href=https://github.com/argoproj/gitops-engine>gitops-engine</a> <code>Public Democratizing GitOps</code></li><li><a href=https://github.com/argoproj/argo-workflows>argo-workflows</a> <code>Workflow engine for Kubernetes</code></li><li><a href=https://github.com/argoproj/argo-cd>argo-cd</a> <code>Declarative continuous deployment for Kubernetes.</code></li><li><a href=https://github.com/argoproj/argo-events>argo-events</a> <code>Event-driven automation framework</code></li><li><a href=https://github.com/argoproj/argo-rollouts>argo-rollouts</a> <code>Progressive Delivery for Kubernetes</code></li></ul><p><code>cd</code>和<code>rollouts</code>一个是持续交付工具，一个是渐进式发布工具。
<code>workflows</code>和<code>events</code>一个是基于容器的任务编排工具，一个是事件驱动框架。这两者搭配可以设计出一个由<code>新建任务事件</code>触发从而<code>启动工作流</code>的方案。</p><p><strong>流程如下</strong>：
![[content/docs/programmer/base/argo_events_workfows.png]]
<img src=/docs/programmer/base/argo_events_workfows.png alt=argo_events_workfows></p><h3 id=sensor作用>sensor作用
<a class=anchor href=#sensor%e4%bd%9c%e7%94%a8>#</a></h3><ul><li>使事件转发和处理松耦合</li><li>Trigger事件的参数化，比如根据事件内容动态生成</li></ul><h2 id=二argo-workflow编排示例>二、Argo Workflow编排示例
<a class=anchor href=#%e4%ba%8cargo-workflow%e7%bc%96%e6%8e%92%e7%a4%ba%e4%be%8b>#</a></h2><blockquote><p>以下是一个扔硬币和打印结果的示例，借此可以熟悉一下<code>Workflow</code>的编排语法</p></blockquote><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-yaml data-lang=yaml><span style=display:flex><span><span style=color:#f92672>apiVersion</span>: <span style=color:#ae81ff>argoproj.io/v1alpha1</span>
</span></span><span style=display:flex><span><span style=color:#f92672>kind</span>: <span style=color:#ae81ff>Workflow</span>
</span></span><span style=display:flex><span><span style=color:#f92672>metadata</span>:
</span></span><span style=display:flex><span>  <span style=color:#f92672>generateName</span>: <span style=color:#ae81ff>coinflip-recursive-</span>
</span></span><span style=display:flex><span><span style=color:#f92672>spec</span>:
</span></span><span style=display:flex><span>  <span style=color:#f92672>entrypoint</span>: <span style=color:#ae81ff>coinflip</span>
</span></span><span style=display:flex><span>  <span style=color:#f92672>templates</span>:
</span></span><span style=display:flex><span>  - <span style=color:#f92672>name</span>: <span style=color:#ae81ff>coinflip</span>
</span></span><span style=display:flex><span>    <span style=color:#f92672>steps</span>:
</span></span><span style=display:flex><span>    - - <span style=color:#f92672>name</span>: <span style=color:#ae81ff>flip-coin</span>
</span></span><span style=display:flex><span>        <span style=color:#f92672>template</span>: <span style=color:#ae81ff>flip-coin</span>
</span></span><span style=display:flex><span>    - - <span style=color:#f92672>name</span>: <span style=color:#ae81ff>heads</span>
</span></span><span style=display:flex><span>        <span style=color:#f92672>template</span>: <span style=color:#ae81ff>heads</span>
</span></span><span style=display:flex><span>        <span style=color:#f92672>when</span>: <span style=color:#e6db74>&#34;{{steps.flip-coin.outputs.result}} == heads&#34;</span>
</span></span><span style=display:flex><span>      - <span style=color:#f92672>name</span>: <span style=color:#ae81ff>tails</span>
</span></span><span style=display:flex><span>        <span style=color:#f92672>template</span>: <span style=color:#ae81ff>coinflip</span>
</span></span><span style=display:flex><span>        <span style=color:#f92672>when</span>: <span style=color:#e6db74>&#34;{{steps.flip-coin.outputs.result}} == tails&#34;</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>  - <span style=color:#f92672>name</span>: <span style=color:#ae81ff>flip-coin</span>
</span></span><span style=display:flex><span>    <span style=color:#f92672>script</span>:
</span></span><span style=display:flex><span>      <span style=color:#f92672>image</span>: <span style=color:#ae81ff>python:alpine3.6</span>
</span></span><span style=display:flex><span>      <span style=color:#f92672>command</span>: [<span style=color:#ae81ff>python]</span>
</span></span><span style=display:flex><span>      <span style=color:#f92672>source</span>: |<span style=color:#e6db74>
</span></span></span><span style=display:flex><span><span style=color:#e6db74>        import random
</span></span></span><span style=display:flex><span><span style=color:#e6db74>        result = &#34;heads&#34; if random.randint(0,1) == 0 else &#34;tails&#34;
</span></span></span><span style=display:flex><span><span style=color:#e6db74>        print(result)</span>        
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>  - <span style=color:#f92672>name</span>: <span style=color:#ae81ff>heads</span>
</span></span><span style=display:flex><span>    <span style=color:#f92672>container</span>:
</span></span><span style=display:flex><span>      <span style=color:#f92672>image</span>: <span style=color:#ae81ff>alpine:3.6</span>
</span></span><span style=display:flex><span>      <span style=color:#f92672>command</span>: [<span style=color:#ae81ff>sh, -c]</span>
</span></span><span style=display:flex><span>      <span style=color:#f92672>args</span>: [<span style=color:#e6db74>&#34;echo \&#34;it was heads\&#34;&#34;</span>]
</span></span></code></pre></div><p>至于部署Argo的步骤网上都有，为了精简文章就不在此赘述。下面关于一些在使用中需要注意的重要问题进行一些说明。</p><h2 id=三空间和性能>三、空间和性能
<a class=anchor href=#%e4%b8%89%e7%a9%ba%e9%97%b4%e5%92%8c%e6%80%a7%e8%83%bd>#</a></h2><h3 id=etcd占用>ETCD占用
<a class=anchor href=#etcd%e5%8d%a0%e7%94%a8>#</a></h3><p>因为<code>Argo</code>是基于<code>Kubernetes</code>的，所以空间问题一般不需要怎么关注，但如果在使用场景中需要频繁创建工作流，还是需要关注一下<code>etcd</code>的空间情况。因为<code>Kubernetes</code>集群中的配置、运行状态和其他各项关键信息都存储在<code>etcd</code>，在频繁创建工作流、且工作流很长时，这类信息会占据大量空间：</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>ETCDCTL_API<span style=color:#f92672>=</span><span style=color:#ae81ff>3</span> etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/healthcheck-client.crt --key /etc/kubernetes/pki/etcd/healthcheck-client.key  --write-out<span style=color:#f92672>=</span>table endpoint status
</span></span></code></pre></div><table><thead><tr><th>   ENDPOINT    </th><th>       ID        </th><th>VERSION</th><th>DB SIZE</th><th>IS LEADER</th><th>IS LEARNER</th><th>RAFT TERM</th><th>RAFT INDEX</th><th>RAFT APPLIED INDEX</th><th>ERRORS</th></tr></thead><tbody><tr><td>127.0.0.1:2379</td><td>871f72e4ab5a28e8</td><td>  3.5.0</td><td> 104 MB</td><td>     true</td><td>     false</td><td>       35</td><td> 348058564</td><td>         348058564</td><td>       </td></tr></tbody></table><p>根据提供的信息，可以看到以下解释：</p><ul><li>VERSION: etcd的版本为3.5.0。</li><li>DB SIZE: etcd数据库当前占用的空间大小为104 MB。</li><li>RAFT APPLIED INDEX: 当前etcd集群已应用的Raft Index为348058564。</li><li>ERRORS: 没有显示任何错误信息。
总体上，这些信息展示了etcd集群的状态，包括节点角色、版本、数据库大小等，经过测试，创建100个十步左右的工作流需要占用20mb空间。</li></ul><h3 id=性能>性能
<a class=anchor href=#%e6%80%a7%e8%83%bd>#</a></h3><p>以下测试全部是通过创建一个概率性失败和重试的workflow测试而来：</p><ul><li>它总共包括三步(第二步和第三步并行执行)</li><li>每一步都有一定的几率失败，失败后每一步最多重试10次，一旦成功后进入下一步</li><li>可以通过调节失败几率模拟出在实际环境中各个workflow分别处于不同进度的情况</li></ul><p>下图中第一步一共重试了四次，失败三次，第四次时成功，随后2b全部失败，2a第三步成功，整个工作流耗时4分钟
![[三步随机出错workflow.png]]
<img src=/docs/programmer/base/argo-workflow-%e6%80%a7%e8%83%bd%e6%b5%8b%e8%af%95/%e4%b8%89%e6%ad%a5%e9%9a%8f%e6%9c%ba%e5%87%ba%e9%94%99workflow.png alt=三步随机出错workflow.png>
在并发启动十五个工作流时，并且每一步都保证100%成功，整个流程花费2min左右，三个子步骤分别花费50-60秒。
![[全部成功的树状图.png]]
![[全成功workflow耗时.png]]
![[全成功的step耗时.png]]</p><p>在全部错误时，并且每一步都保证100%失败，总计经历11次尝试，整个流程花费10分钟左右，11个子步骤分别花费60秒左右
![[全部失败的树状图.png]]
![[全错误workflow耗时.png]]
![[全错误的step耗时.png]]</p><p>可见每一步成功与否，与执行花费无关。不会出现错误重试避让成功工作流的现象。</p><p>使用<code>argo submit retry_template.yaml -n websafe --watch</code> 和 <code>kubectl get pod -n {NAMESPACE} | grep workflow</code>查看工作流运行状态，可知在工作流的每一步执行时都是实时初始化pod，所以以上花费约等于每一步初始化pod所用的时间。即以上时间是在运行逻辑之外无法优化的固定时间花费。
![[watch_workflow.png]]
![[work_flow_pod.png]]</p><h2 id=总结>总结
<a class=anchor href=#%e6%80%bb%e7%bb%93>#</a></h2><p>由以上信息可见<code>Argo WorkFlow</code>有基于 <code>Kubernetes</code>的简单、易用、便于迁移的优点，但同时有启动速度慢，执行工作流的每一步时都具有额外消耗的缺点。</p><p>所以它适用于不关注实时性的业务，本身执行时间长的任务。例如AI中的模型训练，可以令每次训练都无需关注环境配置，可以做到自动资源、埋点分析和生成报表。例如在以下场景中：
![[ai_model_workflow.png]]
训练人员可以通过yaml文件自由更换训练、测试数据，选择输出模型发布方案。可以很方便的查看每一阶段信息，且不用编写代码关注运行环境。 进了工作流程中步骤之间的松耦合，并开辟了在未来工作流中重用组件的可能性。</p></article><footer class=book-footer><div class="flex flex-wrap justify-between"></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><div class=book-comments></div><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#一简介>一、简介</a><ul><li><a href=#sensor作用>sensor作用</a></li></ul></li><li><a href=#二argo-workflow编排示例>二、Argo Workflow编排示例</a></li><li><a href=#三空间和性能>三、空间和性能</a><ul><li><a href=#etcd占用>ETCD占用</a></li><li><a href=#性能>性能</a></li></ul></li><li><a href=#总结>总结</a></li></ul></nav></div></aside></main></body></html>